package com.oop.example.work.bel;

import com.oop.example.processing.Reader;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * Читает HTML документ сформированный MS Word'om
 *
 * @author -
 */
public class HtmlReader implements Reader {

    private String encoding = "UTF-8";

    public HtmlReader(String encoding) {
        this.encoding = encoding;
    }

    @Override
    public String[] read(File file) {
        ArrayList<String> out = new ArrayList<String>();
        try {
            // Open the file that is the first
            // command line parameter
            FileInputStream fstream = new FileInputStream(file);
            // Get the object of DataInputStream
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in, encoding));
            String strLine;
            String fullLine = "";
            boolean inContext = false;
            while ((strLine = br.readLine()) != null) {

                if (strLine.startsWith("<p")) {
                    fullLine = strLine;
                    inContext = true;//вошли в тег <p>
                    if (strLine.endsWith("</p>")) {
                        fullLine = cleanLine(fullLine).trim();
                        out.add(fullLine);
                        fullLine = "";
                        inContext = false;//вышли из тега </p>
                    }
                } else if (strLine.endsWith("</p>")) {
                    fullLine += " " + strLine;
                    fullLine = cleanLine(fullLine).trim();
                    out.add(fullLine);
                    fullLine = "";
                    inContext = false;//вышли из тега </p>
                } else {
                    if (inContext) {
                        fullLine += " " + strLine;
                    }
                }
            }
            in.close();
        } catch (Exception e) {//Catch exception if any
            e.printStackTrace(System.out);
        }
        return out.toArray(new String[]{});
    }

    private static String cleanLine(String str) {
        String src = str;
        String commonChars = "[= a-zA-Z0-9-\\:\\'\\.\\;\"\\,]*";
        //Преобразуем в xml и удаляем все атрибуты        
        
        src = src.replaceAll("<p class=" + commonChars + ">", "<p>");        
        src = src.replaceAll("<b (style|lang)=" + commonChars + ">", "<b>");
        src = src.replaceAll("<span (class|style|lang)=" + commonChars + ">", "<span>");
        src = src.replaceAll("<i (style|lang)=" + commonChars + ">", "<i>");


        Map<String, String> map = new HashMap<String, String>();
        map.put("&#61448;", "&#769;");//причесываем ударения
        map.put("&#61449;", "&#769;");//причесываем ударения
        map.put("&#769;&#769;", "&#769;");//причесываем ударения
        map.put("</b>&#769;<b>", "&#769;");//причесываем ударения
        map.put("<b>&#769;</b>", "&#769;");//причесываем ударения
        map.put("</i>&#769;<i>", "&#769;");//причесываем ударения
        map.put("<i>&#769;</i>", "&#769;");//причесываем ударения
        map.put("</b><b>", "");//объединение нескольких <b>
        map.put("</i><i>", "");//объединение нескольких <i>
        map.put("<o:p></o:p>", "");//лишнее
        map.put("<span>", "");//лишнее
        map.put("</span>", "");//лишнее
        map.put("<br>", "");//лишнее
        map.put("<br/>", "");//лишнее
        map.put("</b>&#769;", "&#769;</b>");//возвращает "потерянные в хвосте" ударения
        map.put("  ", " ");//Пробелы двойные
        map.put("</b>, <b>", ", ");
        map.put("<u>", "");
        map.put("</u>", "");
        map.put("</i>\\)", ")</i>");
        map.put("\\(<i>", "<i>(");
        map.put("</i>\\.", ".</i>");
        map.put("</i> <i>", " ");
        map.put("</i><b>,</b> <i>", ", ");
        map.put("</i>&amp;", "&amp;</i>");
        map.put("&amp;<i>", "<i>&amp;");


        boolean exit = false;
        while (!exit) {
            exit = true;
            for (String key : map.keySet()) {
                String cont = key.replace("\\", "");
                if (src.contains(cont)) {
                    src = src.replaceAll(key, map.get(key));
                    exit = false;
                    break;
                }
            }
        }
        
        //src = src.replaceAll("<TEMPB>", "<b style='color:aqua'>");
        return src;
    }

    public static void main(String[] args) {
        String str =
                "<p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;text-align: "
                + "justify;line-height:normal;tab-stops:10.0cm 290.6pt 439.45pt;mso-layout-grid-align: "
                + "none;text-autospace:none;vertical-align:middle'><b><span lang=PT-BR "
                + "style='font-size:12.0pt;font-family:\"Arial Unicode MS\",\"sans-serif\";color:aqua; "
                + "letter-spacing:.1pt;mso-ansi-language:PT-BR'>a.bo.nar</span></b><b><span "
                + "lang=PT-BR style='font-size:12.0pt;font-family:\"Arial Unicode MS\",\"sans-serif\"; "
                + "color:black;letter-spacing:.1pt;mso-ansi-language:PT-BR'> [abon&acute;ar] vt 1 "
                + "Abonar, aprovar. 2 Afian&ccedil;ar, garantir, creditar. 3 Adubar. vt+vpr 4 "
                + "Assinar, fazer uma assinatura de. vt 5 Com Pagar (uma presta&ccedil;&atilde;o). "
                + "quien no abona en la fecha correspondiente las cuotas debidas, debe pagar altos "
                + "intereses / quem n&atilde;o paga na data certa as presta&ccedil;&otilde;es "
                + "devidas, deve pagar juros altos.</span></b><b><span lang=PT-BR "
                + "style='font-size:12.0pt;font-family:\"Arial Unicode MS\",\"sans-serif\";letter-spacing: "
                + ".1pt;mso-ansi-language:PT-BR'><o:p></o:p></span></b></p>";
        System.out.println(cleanLine(str));
    }

    @Override
    public String getEncoding() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void setEncoding(String encoding) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
